requires expression
https://cppreference.com/w/cpp/language/requires.html
模板化实体(Templated entity)是直接或者间接依赖模板参数的实体包括
- 模板本身:类模板、函数模板、变量模板、别名模板
- 模板的成员
- concept
- 模板实例化结果
- 在模板实体内部被创造的任何实体,如局部类,局部变量,友元函数
从目的上来说,requires 表达式提供了一种为模板化实体添加限制的方法。
从语法层面上来说,requires 表达式的结果是一个 constraint,其只在编译期发挥作用、可以用于修饰模板化实体、可以被储存在 concept 中。
requires
后面的部分分条描述了限制 requires (parameter-list) {requirements-seq}
。限制可以利用完全形式化的参数来辅助描述。每一条限制(Requirements)都属于以下几种之一
- 简单需求(Simple requirements)
expresssion;
: 检查expression
的语法。 - 类型需求(Type requirements)
typename identifier
:检查identifier
标识的类型是否存在。如内嵌类型、类模板特化、别名模板特化。identifier 可以被限定 - 复合需求(Compound requirements)
{expression} noexcept -> type-constraint
:首先expression
进行模板参数替换确保合法,其次如果有 noexcept 检查是否潜在地可以抛出异常,最后type-constraint
进行模板参数替代确保合法而且求值为 true - 嵌套需求(Nested requirements)
requires constraint-expression
:满足短路判定的性质